package com.baizhi.utils;

import com.baizhi.entity.Guru;
import org.apache.poi.hssf.usermodel.HSSFCell;
import org.apache.poi.hssf.usermodel.HSSFRow;
import org.apache.poi.hssf.usermodel.HSSFSheet;
import org.apache.poi.hssf.usermodel.HSSFWorkbook;
import org.apache.poi.poifs.filesystem.POIFSFileSystem;
import org.springframework.web.multipart.MultipartFile;

import java.io.FileInputStream;
import java.io.IOException;
import java.lang.reflect.Field;
import java.util.ArrayList;
import java.util.List;

public class PoiUtils {
    //输入要写到excel中的集合和表头，即可为你把集合的所有内容写入文件中并返回这个文件对象（未将文件对象写入磁盘）
    public static HSSFWorkbook out(List<Guru> guruList,String[] titles) throws IOException, IllegalAccessException {
//        1. 新建一个Excel文件   HSSFWorkbook
        HSSFWorkbook workbook = new HSSFWorkbook();
//        2. 在Excel文件中新建一张工作表  HSSFSheet
        HSSFSheet sheet = workbook.createSheet();
//        3. 在工作表中选中在哪一行写数据
        HSSFRow row = sheet.createRow(0);
        for (int i=0;i<titles.length;i++){
//        4. 在这一行中选中在哪一个单元格中写数据
            HSSFCell cell = row.createCell(i);
//        5. 在单元格中写数据  setCellValue()
            cell.setCellValue(titles[i]);
        }
        int a=1;
        for (Guru datum : guruList) {
            HSSFRow row1 = sheet.createRow(a);
            Class<? extends Guru> datumClass = datum.getClass();
            Field[] declaredFields = datumClass.getDeclaredFields();
            for (int i = 0; i <declaredFields.length ; i++) {
                Field field=declaredFields[i];
                field.setAccessible(true);
                //选择一个单元格并写入数据
                row1.createCell(i).setCellValue(field.get(datum).toString());
            }
            a++;
        }
        return workbook;
    }
    //输入HSSFWorkbook对象（excel文件），即可为你把excel中的内容读取到集合中并返回这个集合
    public static List<Guru> in(HSSFWorkbook hssfWorkbook) throws IOException {
        //通过文件对象拿到表对象
        HSSFSheet sheet=hssfWorkbook.getSheetAt(0);
        List<Guru> guruList=new ArrayList<>();
        int lastRowNum = sheet.getLastRowNum();
        for (int i=1;i<=lastRowNum;i++){
            //通过表对象拿到行对象
            HSSFRow row=sheet.getRow(i);
            //通过行对象拿到单元格对象
            HSSFCell cell = row.getCell(0);
            //取值
            int id = 0;
            try {
                id = Integer.parseInt(cell.getStringCellValue());
            } catch (Exception e) {
                id= (int) cell.getNumericCellValue();
            }
            //选择一个单元格并读取数据
            String name=row.getCell(1).getStringCellValue();
            String img=row.getCell(2).getStringCellValue();
            String newName=row.getCell(3).getStringCellValue();
            int state = 0;
            try {
                state=(int)cell.getNumericCellValue();
            } catch (Exception e) {
                state = Integer.parseInt(row.getCell(4).getStringCellValue());
            }
            guruList.add(new Guru(id,name,img,newName,state));
        };
        return guruList;
    }
    //输入excel文件地址，即可为你把excel中的内容读取到集合中并返回这个集合
    public static List<Guru> in(String url) throws IOException {
        //读取文件
        FileInputStream fileInputStream=new FileInputStream(url);
        //通过poi解析流，拿到excel对象
        HSSFWorkbook hssfWorkbook=new HSSFWorkbook(fileInputStream);
        return in(hssfWorkbook);
    }
    //传入MultipartFile对象，即可返回一个此excel文件中包含的数据的集合
    public static List<Guru> in(MultipartFile file) throws IOException {
        //这一行代码可以把MultipartFile对象转成HSSFWorkbook对象
        HSSFWorkbook hssfWorkbook =new HSSFWorkbook(new POIFSFileSystem(file.getInputStream()));
        return in(hssfWorkbook);
    }
}
